<?php
declare (strict_types = 1);

namespace app\middleware;

use think\facade\Session;
use think\Response;

/**
 * 认证中间件
 * Class Auth
 * @package app\middleware
 */
class Auth
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        // 检查是否是OPTIONS预检请求，如果是则跳过验证
        if ($request->method() === 'OPTIONS') {
            return $next($request);
        }
        
        // 检查是否是登录接口，如果是则跳过验证
        $path = $request->pathinfo();
        if ($path === 'api/auth/login') {
            return $next($request);
        }
        
        // 从请求头获取token（支持大小写）
        $token = $request->header('Access-Token') ?: $request->header('access-token') ?: $request->header('Authorization');
        
        // 添加调试日志
        \think\facade\Log::info('Auth中间件 - 请求路径: ' . $path);
        \think\facade\Log::info('Auth中间件 - 所有请求头: ' . json_encode($request->header()));
        \think\facade\Log::info('Auth中间件 - Access-Token头: ' . $request->header('Access-Token'));
        \think\facade\Log::info('Auth中间件 - access-token头: ' . $request->header('access-token'));
        \think\facade\Log::info('Auth中间件 - 接收到的token: ' . ($token ?: '无'));
        
        if (!$token) {
            \think\facade\Log::info('Auth中间件 - token为空，返回401');
            // 验证失败，返回未登录
            return json([
                'code' => 401,
                'message' => '请先登录',
                'data' => null
            ], 401);
        }
        
        // 首先尝试session验证（同域情况）
        $adminId = Session::get('admin_id');
        $sessionToken = Session::get('admin_token');
        
        if ($sessionToken && $token === $sessionToken && $adminId) {
            // session token验证通过
            $request->adminId = $adminId;
            return $next($request);
        }
        
        // 如果session验证失败，尝试数据库验证（跨域情况）
        \think\facade\Log::info('Auth中间件 - session验证失败，尝试数据库验证');
        try {
            $admin = \app\model\Admin::where('token', $token)
                ->where('token_expire_time', '>', date('Y-m-d H:i:s'))
                ->find();
            
            \think\facade\Log::info('Auth中间件 - 数据库查询结果: ' . ($admin ? '找到用户ID:' . $admin->id : '未找到用户'));
            
            if ($admin && $admin->status == 1) {
                \think\facade\Log::info('Auth中间件 - 数据库token验证通过');
                // 数据库token验证通过
                $request->adminId = $admin->id;
                // 同时设置session（如果可能的话）
                Session::set('admin_id', $admin->id);
                Session::set('admin_token', $token);
                return $next($request);
            } else {
                \think\facade\Log::info('Auth中间件 - 数据库token验证失败，用户状态: ' . ($admin ? $admin->status : '用户不存在'));
            }
        } catch (\Exception $e) {
            // 数据库查询失败，记录日志
            \think\facade\Log::error('Token验证失败: ' . $e->getMessage());
        }
        
        // 验证失败，返回未登录
        \think\facade\Log::info('Auth中间件 - 所有验证都失败，返回401');
        return json([
            'code' => 401,
            'message' => '请先登录',
            'data' => null
        ], 401);
    }
}